assertNear(Math.expm1(1e-300), 1e-300);
assertNear(Math.expm1(1e-100), 1e-100);
assertNear(Math.expm1(1e-14), 1.000000000000005e-14);
assertNear(Math.expm1(1e-6), 0.0000010000005000001665);

var expm1_data = [
    [ -1.875817529344e-70, -1.875817529344e-70 ],
    [ -7.09962844069878e-15, -7.099628440698755e-15 ],
    [ -2.114990849122478e-10, -2.1149908488988187e-10 ],
    [ -0.0000031404608812881633, -0.000003140455950046052 ],

    [ -0.0000011039855962733358, -0.0000011039849868814618 ],
    [ -0.000015114666893502755, -0.0000151145526675006 ],
    [ -0.000033870281179478836, -0.000033869707587981166 ],
    [ -0.00043952149320897676, -0.00043942491778698985 ],
    [ -0.005553725496786973, -0.005538332073473123 ],
    [ -0.05122020579778827, -0.049930563302241604 ],
    [ -0.4721357117742938, -0.3763311320344197 ],
    [ -1.2781607348262256, -0.7214508446489242 ],

    [ 1.875817529344e-70, 1.875817529344e-70 ],
    [ 6.261923313140869e-30, 6.261923313140869e-30 ],
    [ 7.09962844069878e-15, 7.099628440698805e-15 ],
    [ 1.3671879628418538e-12, 1.3671879628427884e-12 ],
    [ 2.114990849122478e-10, 2.1149908493461373e-10 ],
    [ 1.6900931765206906e-8, 1.6900931908027652e-8 ],
    [ 0.0000031404608812881633, 0.0000031404658125405988 ],

    [ 0.0000011039855962733358, 0.0000011039862056656584 ],
    [ 0.000015114666893502755, 0.000015114781120655907 ],
    [ 0.000033870281179478836, 0.00003387085478392845 ],
    [ 0.00043952149320897676, 0.0004396180969330924 ],
    [ 0.005553725496786973, 0.005569176019645543 ],
    [ 0.05122020579778827, 0.05255464640120383 ],
    [ 0.4721357117742938, 0.6034149712523235 ],
    [ 1.2781607348262256, 2.590030631181154 ],

    [ 3.0693960800487883, 20.528897017773147 ],
    [ 5.560441648750136, 258.9376120972927 ],
    [ 7.4227656046482595, 1672.6557833191303 ],
    [ 11.378926299184645, 87458.07941992789 ],
];

for (var [x, y] of expm1_data)
    assertNear(Math.expm1(x), y);

var sloppy_tolerance = 34;

var expm1_data_sloppy = [
    [ 20.11881628179155, 546375092.2355127 ],
    [ 33.45034324980283, 336743709091858.2 ],
    [ 46.43974518513109, 147409364838076710000 ],
    [ 54.60105936314322, 5.163435870507142e+23 ],
    [ 84.29619209850242, 4.067907545704549e+36 ],
    [ 125.38131800315817, 2.8340959047812913e+54 ],
    [ 216.85489905212918, 1.5096839294759775e+94 ],
];

for (var [x, y] of expm1_data_sloppy)
    assertNear(Math.expm1(x), y, sloppy_tolerance);

reportCompare(0, 0, "ok");
